import vue from "@vitejs/plugin-vue";

import {UserConfig, ConfigEnv, loadEnv, defineConfig} from "vite";

import AutoImport from "unplugin-auto-import/vite";
import Components from "unplugin-vue-components/vite";
import {ElementPlusResolver} from "unplugin-vue-components/resolvers";
import {createHtmlPlugin} from 'vite-plugin-html'

import Icons from "unplugin-icons/vite";
import IconsResolver from "unplugin-icons/resolver";

import {createSvgIconsPlugin} from "vite-plugin-svg-icons";

import UnoCSS from "unocss/vite";
import path from "path";

import viteCompression from "vite-plugin-compression";

const htmlParams = {
	minify: true,
	pages: [
		{
			filename: 'index',     // filename 默认是template文件名，就是index.html
			entry: '/src/main.ts',
			template: 'index.html',
		}
	]
}

const pathSrc = path.resolve(__dirname, "src");

export default defineConfig(({mode}: ConfigEnv): UserConfig => {
	
	const env = loadEnv(mode, process.cwd());
	return {
		base: './',
		resolve: {
			alias: {
				"@": pathSrc,
			},
			extensions: ['.mjs', '.js', '.ts', '.jsx', '.tsx', '.json', '.vue'], // 导入时想要忽略的扩展名列表
		},
		build: {
			assetsDir: './src/assets',
			target: 'es2015',
			outDir: 'dist', // 输出文件的目录
			// assetsInlineLimit: 4096, // 在生成的包中压缩文件的大小限制（以字节为单位）
			cssCodeSplit: true, // 是否将CSS拆分为更小的块并独立加载
			emptyOutDir: true,
			minify: 'terser', // 代码压缩方式
			terserOptions: {
				compress: {
					// 生产环境时移除console.log调试代码
					drop_console: true,
					drop_debugger: true,
				}
			},
			rollupOptions: {
				input: {},       // input 不用管，插件内会处理
				output: {
					compact: true,
					entryFileNames: "static/js/[name]-[hash].js",
					chunkFileNames: "static/js/[name]-[hash].js",
					assetFileNames: "static/[ext]/[name].[ext]",
				}
			},
			sourcemap: false // 是否生成sourcemap文件
		},
		plugins: [
			vue(),
			createHtmlPlugin(htmlParams),
			UnoCSS({}),
			AutoImport({
				// 自动导入 Vue 相关函数，如：ref, reactive, toRef 等
				imports: ["vue", "@vueuse/core"],
				eslintrc: {
					enabled: false,
					filepath: "./.eslintrc-auto-import.json",
					globalsPropValue: true,
				},
				resolvers: [
					// 自动导入 Element Plus 相关函数，如：ElMessage, ElMessageBox... (带样式)
					ElementPlusResolver(),
					IconsResolver({}),
				],
				vueTemplate: true,
				// 配置文件生成位置(false:关闭自动生成)
				dts: false,
				// dts: "src/types/auto-imports.d.ts",
			}),
			Components({
				resolvers: [
					// 自动导入 Element Plus 组件
					ElementPlusResolver(),
					// 自动导入图标组件
					IconsResolver({
						// @iconify-json/ep 是 Element Plus 的图标库
						enabledCollections: ["ep"],
					}),
				],
				// 指定自定义组件位置(默认:src/components)
				dirs: ["src/**/components"],
				// 配置文件位置(false:关闭自动生成)
				dts: false,
				// dts: "src/types/components.d.ts",
			}),
			
			Icons({
				// 自动安装图标库
				autoInstall: true,
			}),
			
			createSvgIconsPlugin({
				// 指定需要缓存的图标文件夹
				iconDirs: [path.resolve(pathSrc, "assets/icons")],
				// 指定symbolId格式
				symbolId: "icon-[dir]-[name]",
			}),
			// 代码压缩
			viteCompression({
				verbose: true, // 默认即可
				disable: true, // 是否禁用压缩，默认禁用，true为禁用,false为开启，打开压缩需配置nginx支持
				deleteOriginFile: true, // 删除源文件
				threshold: 10240, // 压缩前最小文件大小
				algorithm: "gzip", // 压缩算法
				ext: ".gz", // 文件类型
			}),
		],
		// assetsInclude: ['**/*.html'],
		css: {
			// CSS 预处理器
			preprocessorOptions: {
				//define global scss variable
				scss: {
					javascriptEnabled: true,
					additionalData: `
            @use "@/styles/variables.scss" as *;
          `,
				},
			},
		},
		server: {
			host: "0.0.0.0",
			port: Number(env.VITE_APP_PORT),
			open: true, // 运行是否自动打开浏览器
			proxy: {
				// 反向代理解决跨域
				[env.VITE_APP_BASE_API]: {
					target: 'http://127.0.0.1:5001',	//生产环境
					//  target: 'http://127.0.0.1:5001',	//开发环境
					//target: 'http://111.11.251.13:5001',	//测试环境
					// target: 'http://192.168.110.135:16108/',	// 小唐
					//  target: 'http://111.11.251.13:5001',	//线上测试
					changeOrigin: true,
					rewrite: (path) => path.replace(new RegExp("^" + env.VITE_APP_BASE_API), "") // 替换 /dev-api 为 target 接口地址
					// onProxyReq: customLogger,
				},
			},
		},
		// 预加载项目必需的组件
		optimizeDeps: {
			include: [
				"vue",
				"vue-router",
				"pinia",
				"axios",
				"element-plus/es/components/form/style/css",
				"element-plus/es/components/form-item/style/css",
				"element-plus/es/components/button/style/css",
				"element-plus/es/components/input/style/css",
				"element-plus/es/components/input-number/style/css",
				"element-plus/es/components/switch/style/css",
				"element-plus/es/components/upload/style/css",
				"element-plus/es/components/menu/style/css",
				"element-plus/es/components/col/style/css",
				"element-plus/es/components/icon/style/css",
				"element-plus/es/components/row/style/css",
				"element-plus/es/components/tag/style/css",
				"element-plus/es/components/dialog/style/css",
				"element-plus/es/components/loading/style/css",
				"element-plus/es/components/radio/style/css",
				"element-plus/es/components/radio-group/style/css",
				"element-plus/es/components/popover/style/css",
				"element-plus/es/components/scrollbar/style/css",
				"element-plus/es/components/tooltip/style/css",
				"element-plus/es/components/dropdown/style/css",
				"element-plus/es/components/dropdown-menu/style/css",
				"element-plus/es/components/dropdown-item/style/css",
				"element-plus/es/components/sub-menu/style/css",
				"element-plus/es/components/menu-item/style/css",
				"element-plus/es/components/divider/style/css",
				"element-plus/es/components/card/style/css",
				"element-plus/es/components/link/style/css",
				"element-plus/es/components/breadcrumb/style/css",
				"element-plus/es/components/breadcrumb-item/style/css",
				"element-plus/es/components/table/style/css",
				"element-plus/es/components/tree-select/style/css",
				"element-plus/es/components/table-column/style/css",
				"element-plus/es/components/select/style/css",
				"element-plus/es/components/option/style/css",
				"element-plus/es/components/pagination/style/css",
				"element-plus/es/components/tree/style/css",
				"element-plus/es/components/alert/style/css",
				"@vueuse/core",
				
				"path-to-regexp",
				"echarts",
				"@wangeditor/editor",
				"@wangeditor/editor-for-vue",
				"vue-i18n",
				"codemirror",
			],
		},
	};
});
